'''
步骤:
1.文件打开
    格式: open(文件路径,读写模式,指定编码集) 这个函数的返回值是一个file对象
2.文件读取
    格式:
        文件对象.read(n)
        文件对象.readline()
        文件对象.readlines()
3.文件关闭
    格式: 文件对象.close()  文件关闭后将不能继续操作文件对象
'''

# 1. 打开文件
# def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True):  # known special case of open
# 第一个参数 file: 填写要打开文件的路径 (使用鼠标右键点击文件 >> copy >> copy path)
# 第二个参数 mode: 读写模式 r 代表只读, w代表只写 , a 代表追加
# 第三个参数 encoding : 指定编码集
file = open('1.txt', mode='r', encoding='utf8')

# 2. 读取文件内容
# 方式一: read()
# read() 可以一次性读取全部文件内容
# content = file.read()
# print('方式一:', content)

# 方式二: read(n)
# read(n) 可以指定最大读取字符数, 如果填写4,证明最多读取4个字符. (如果内部只有一个字符,则读取一个.)
content = file.read(4)
print('方式二:', content)
# # 如果继续使用read读取数据,将会在之前读取的数据结尾位置继续读取,直到全部读取完成后返回空字符串.
content = file.read(4)
print('方式二:', content)
content = file.read(4)
print('方式二:', content)

# 方式三: readline()
# readline()一次读取一行数据,以\n作为读取终点. readline 读取数据时,如果数据不存在读取空字符串
content = file.readline()
print('方式三:', content)
# # 如果再次使用readline读取数据,则会读取下一行,直到数据读取完成后,返回空字符串
content = file.readline()
print('方式三:', content)

# 方式四: readlines()
# readlines() 可以一次性读取全部数据,将数据以行为单位进行分隔,生成一个列表,将子字符串存储进去 (返回值是list)
# readlines的参数hint 代表的不是行数.
content = file.readlines()
print('方式四:', content, type(content))

print('----------最常用的数据读取方式时read(n)如果需要读取全部数据,可以使用循环-----------')
# 我们最常用的数据读取方式时read(n)如果需要读取全部数据,可以使用循环
# 这种写法的好处,就是不会一次性占用大量的内容.
while True:
    content = file.read(4)
    # 当获取到大的数据content 为空时,证明所有数据已经读取完成.
    if content == '':
        break
    print(content, end='')

# 3. 关闭文件
# 如果不关闭文件,会持续占用内存,会影响后续文件的读写效率
file.close()

print('---------------------')
# 练习
# 自己写一个文件读写代码， 创建一个txt文件，内部书写静夜思， 通过Python将其独读取出来
# UnicodeDecodeError: 'gbk' codec can't decode byte 0x89 in position 14: illegal multibyte sequence
# 注意: 在windows中一定要使用encoding进行编码集的指定. 因为我们在windows中默认使用gbk进行读取
# 1. 打开文件
file = open('shi.txt', mode='r', encoding='utf8')
# 2. 读取文件
print(file.read())
# 3. 关闭文件
file.close()

# 注意: 用什么编码格式写入, 就要用什么编码格式读取,否则无法读取成功.
